#include "telajogo.h"
#include "ui_telajogo.h"
#include <QDesktopWidget>
#include <QGraphicsScene>
#include <QPixmap>
#include "valordados.h"

TelaJogo *TelaJogo::instance = NULL;

TelaJogo::TelaJogo(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::TelaJogo)
{
    TelaJogo::instance = this;
    ui->setupUi(this);
    this->setBaseSize(1200,700);
    this->setMaximumSize(1200,700);
    this->setMinimumSize(1200,700);

    this->ui->graphicsView->setGeometry(0, 0,
                                        1200 - this->ui->menuBar->height(), 700);
    this->ui->graphicsView->setMinimumSize(this->size().width(),
                                           this->size().height() - this->ui->menuBar->height() + 10);
    this->scene = new QGraphicsScene(this);
    this->scene->setSceneRect(0, 0, this->ui->graphicsView->rect().width() - 20,
                              this->ui->graphicsView->rect().height() - 20);
    this->ui->graphicsView->setScene(scene);

    this->menu = new MenuBaixo(this->scene);
    this->menu->setRect(0, 0, 950, 155);
    this->menu->setPos(0,505);

    this->marcadores = new ListaMarcadores(scene, this);

    this->mapa = new QPixmap(":/mapa/war-mapa prog.JPG");
    *(this->mapa) = this->mapa->scaled(940, 500);
    this->scene->addPixmap(*mapa);
    QLinearGradient tab_gradient = QLinearGradient(this->rect().x(), this->rect().y(),
                                                   this->rect().x(), this->rect().y() + this->rect().height());
    tab_gradient.setColorAt(0, Qt::black);
    tab_gradient.setColorAt(0.5, Qt::darkGray);
    tab_gradient.setColorAt(1, Qt::lightGray);
    this->scene->setBackgroundBrush(QBrush(tab_gradient));

    this->participante = NULL;

    this->chat = new JanelaChat(this);
    this->chat->setGeometry(950, this->ui->menuBar->height() - 2, this->rect().width(), this->rect().height());
    this->chat->setWindowFlags(Qt::SubWindow);
    this->chat->desabilitarBotao();

    connect (this->ui->actionIniciar_Conex_o, SIGNAL(triggered()), this, SLOT(mostrarTelaConexao()));

    connect (JanelaConexao::getInstance(this), SIGNAL(novoParticipante(QString,QString,int)),
             this, SLOT(criarParticipante(QString,QString,int)));

    connect (this->menu->finalizar_alocacao_soldados, SIGNAL(clicked()),
             this->marcadores, SLOT (alocacaoConfirmada()));
    connect (this->marcadores, SIGNAL(mostrarBotaoConfirmar()), this->menu, SLOT(mostrarBotao()));
    connect (this->marcadores, SIGNAL(esconderBotaoConfirmar()), this->menu, SLOT(esconderBotao()));
    connect (this->marcadores, SIGNAL(mostrarBotaoPassarVez()), this->menu, SLOT(mostrarPassarVez()));
    connect (this->marcadores, SIGNAL(esconderBotaoPassarVez()), this->menu, SLOT(esconderPassarVez()));
    connect (this->menu->passar_vez, SIGNAL(clicked()), this->marcadores, SIGNAL(esconderBotaoPassarVez()));
    connect (this->marcadores, SIGNAL(mudancaSoldadosDisponiveis(int)), this->menu, SLOT(soldadosAlterados(int)));

    ValorDados* dados = new ValorDados();
//    dados->mostrarDados("<jogador>alvaro<dado>3<dado>2<dado>1<jogador>ronaldo<dado>3<dado>2<dado>1");
    Q_UNUSED(dados);
}

TelaJogo::~TelaJogo()
{
    delete ui;
}

void TelaJogo::criarParticipante(QString nome, QString endereco_ip, int porta_conexao)
{
    this->participante = new Participante(nome, endereco_ip, porta_conexao);
    connect (this->participante->socket, SIGNAL(connected()), this, SLOT(setarSocket()));
}

void TelaJogo::setarSocket()
{
    connect (this->participante, SIGNAL(novaMensagem(QString,QString)), this->chat, SLOT (adicionaTexto(QString,QString)));
    connect (this->chat, SIGNAL(mensagemChat(QString)), this->participante, SLOT (enviaMensagem(QString)));
    connect (this->participante, SIGNAL(objetivoEntregue(QString)), this->menu, SLOT(novoObjetivo(QString)));
    connect (this->participante, SIGNAL(paisSorteado(QString)), this->marcadores, SLOT(mudarEstadoPais(QString)));
    connect (this->participante, SIGNAL(tropasRecebidas(int)), this->marcadores, SLOT(tropasRecebidas(int)));
    connect (this->participante, SIGNAL(tropasRecebidas(int)), this->menu, SLOT (tropasRecebidas(int)));
    connect (this->marcadores, SIGNAL(enviarMudancasAlocacao(QList<MarcadorPais*>)),
             this->participante, SLOT(enviarMudancasAlocacao(QList<MarcadorPais*>)));
    connect (this->participante, SIGNAL(mudancaTropasPais(QString)), this->marcadores, SLOT (mudancaTropaPais(QString)));
    connect (this->participante, SIGNAL(atualizarJogadorAtual()), this->menu, SLOT(atualizarMenu()));
    connect (this->participante, SIGNAL(atualizarJogadorAtual()), this->chat, SLOT(habilitarBotao()));
    connect (this->marcadores, SIGNAL(ataqueDeclarado(QString)), this->participante, SLOT (enviaMensagem(QString)));
    connect (this->menu->passar_vez, SIGNAL(clicked()), this->participante, SLOT(encerrarTurno()));
    connect (this->menu, SIGNAL(mensagemChecarObjetivo(QString)), this->participante, SLOT(enviaMensagem(QString)));
    connect (this->participante, SIGNAL(mostrarDados(QString)), ValorDados::instance, SLOT(mostrarDados(QString)));
    connect (this->participante, SIGNAL(paisConquistado(QString)), this->marcadores, SLOT(paisConquistado(QString)));
    connect (this->participante, SIGNAL(jogadorAdicionado(QString)), this->chat, SLOT(novoJogador(QString)));
    connect (this->participante, SIGNAL(jogoFinalizado()), this->chat, SLOT(desabilitarBotao()));
    connect (this->participante, SIGNAL(jogoFinalizado()), this->menu, SLOT(esconderBotao()));
    connect (this->participante, SIGNAL(jogoFinalizado()), this->menu, SLOT(esconderPassarVez()));

    this->chat->setNome(this->participante->getNome());
    this->menu->nome_participante = this->participante->getNome();
    this->marcadores->nome_jogador = this->participante->getNome();
    this->menu->update();
}

void TelaJogo::mostrarTelaConexao()
{
    if (this->participante == NULL)
        JanelaConexao::getInstance(this)->show();
    else if (!(this->participante->socket->state() == QTcpSocket::ConnectedState ||
               this->participante->socket->state() == QTcpSocket::ConnectingState)) {
        delete this->participante;
        JanelaConexao::getInstance(this)->show();
    }
}
